package persistencia;


import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import domain.Factura;
import domain.ItemFactura;
import domain.Usuario;

public class AdministradorPersistenciaFacturas {
	private static AdministradorPersistenciaFacturas pool;
	private AdministradorPersistenciaUsuario administradorPersistenciaUsuario;

	private AdministradorPersistenciaFacturas() {
		administradorPersistenciaUsuario = AdministradorPersistenciaUsuario
		.getInstancia();
	}

	public static AdministradorPersistenciaFacturas getInstancia() {
		if (pool == null)
			pool = new AdministradorPersistenciaFacturas();
		return pool;
	}

	public void insert(Factura c) {
		// Obtener conexion BD
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Facturas (Fecha, InicioPeriodo, FinPeriodo , ImporteTotal, UsuarioId) VALUES (?,?,?,?,?)";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			ps.setDate(1, new Date(c.getFecha().getTime()));
			ps.setDate(2, new Date(c.getInicioPeriodo().getTime()));
			ps.setDate(3, new Date(c.getFinPeriodo().getTime()));
			ps.setFloat(4, c.getImporteTotal());
			ps.setInt(5, c.getUsuario().getId());
			

			ps.executeUpdate();
			ResultSet generatedKeys = ps.getGeneratedKeys();
			
			if (generatedKeys.next()) {
				ItemFactura[] v = new ItemFactura[c.getItemsFactura().size()];
				c.getItemsFactura().toArray(v);				
				
				
				for (ItemFactura i : v){
					String s = "INSERT INTO ItemFacturas (FacturaId,ConsumoId, Costo) VALUES(?,?, ?)";
					ps = con.prepareStatement(s);
					ps.setInt(1, generatedKeys.getInt(1));
					ps.setInt(2, i.getConsumo().getId());
					ps.setFloat(3, i.getCosto());
					ps.execute();
				}	            
	        } else {
	            throw new SQLException("Creating user failed, no generated key obtained.");
	        }		

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Insertar Cliente: "
					+ e.getMessage());
			System.out.println("Stack Trace al Insertar Cliente: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}

	}

	public Vector<Factura> getFacturasCliente(int idUsuario) {
		Vector<Factura> v = new Vector<Factura>();

		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {

			String senten = "SELECT * from Facturas WHERE UsuarioId = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, idUsuario);
			ResultSet result = ps.executeQuery();

			while (result.next()) {
				v.add(mapFactura(result));
			}

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Error al cargar las facturas: "
					+ e.getMessage());			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		return v;
	}
	
	private Factura mapFactura(ResultSet result) throws SQLException {
		Usuario usuario = administradorPersistenciaUsuario.getUsuario(result
				.getInt("UsuarioId"));

		return new Factura(result.getInt("FacturaId"), 
									  result.getDate("Fecha"),
									  result.getDate("InicioPeriodo"),
									  result.getDate("FinPeriodo"),
									  result.getFloat("ImporteTotal"),
									  usuario);
		
	}
}
